package top.goldenyear.porpoise.framework.web.core.generator.dialect;

import top.goldenyear.porpoise.framework.web.core.generator.dialect.impl.DefaultDialect;
import top.goldenyear.porpoise.framework.web.core.generator.dialect.impl.MySqlDialect;
import top.goldenyear.porpoise.framework.web.core.generator.dialect.impl.OracleDialect;
import top.goldenyear.porpoise.framework.web.core.generator.dialect.impl.SqliteDialect;
import top.goldenyear.porpoise.framework.web.core.generator.model.TableMeta;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 方言接口
 *
 * @author airhead
 */
public interface IDialect {
  /** 默认方言 */
  IDialect DEFAULT = new DefaultDialect();

  /** MySQL 方言 */
  IDialect MYSQL = new MySqlDialect();

  /** Oracle 方言 */
  IDialect ORACLE = new OracleDialect();

  /** Sqlite 方言 */
  IDialect SQLITE = new SqliteDialect();

  /**
   * 构建表和列的信息
   *
   * @param tableMeta 存入的表对象
   * @param dbMeta 数据库元数据
   * @param conn 连接
   * @throws SQLException 发生 SQL 异常时抛出
   */
  void buildTableColumns(TableMeta tableMeta, DatabaseMetaData dbMeta, Connection conn)
      throws SQLException;

  /**
   * 获取表的描述信息
   *
   * @param dbMeta 数据库元数据
   * @param conn 连接
   * @param schema 模式
   * @param types 结果集类型
   * @return 结果集
   * @throws SQLException 发生 SQL 异常时抛出
   */
  ResultSet getTablesResultSet(
      DatabaseMetaData dbMeta, Connection conn, String schema, String[] types) throws SQLException;
}
